package jumavidesktop.GUI.Mantenimientos;

import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import jumavidesktop.GUI.Mantenimientos.interfaz.IMantenimiento;
import jumavidesktop.GUI.mensajeModal.MensajeInfoError;
import jumavidesktop.LibVimso.AuxVimso;
import jumavidesktop.Otros.Pojos.MyRespuesta;

/**
 *
 * @author vimso
 */
public abstract class Mantenimiento  extends javax.swing.JInternalFrame {

    /**
     * Creates new form MantenimientoMatriculas
     */
    IMantenimiento controlador;
    private boolean centinela = false;
    private JFrame padre;
    
    public Mantenimiento(String titulo) {
        super(titulo, true, true, true, true);
        this.updateUI();
        initComponents();
        quitarIconos();
    }
    
    protected void myPostContructor()
    {
        //cargo el controlador
        this.controlador=this.getControlador();
        //ajusto el tamaño del formulario, de modo que coja justo lo que yo necesito.
        //muevo al primer registro
        this.llenarComboBox();
        this.moverInicio();    
        this.repintar();
    }    
    
    //<editor-fold defaultstate="collapsed" desc="Movimiento">
    protected void mover(AuxVimso.Movimiento movimiento) {
        this.controlador.setCreandoEntidad(false);
        MyRespuesta respuesta = new MyRespuesta();
        //Según el movimiento
        switch (movimiento) {
            case INICIO:
                respuesta = this.controlador.inicio();
                break;
            case ANTERIOR:
                respuesta = this.controlador.anterior();
                break;
            case SIGUIENTE:
                respuesta = this.controlador.siguiente();
                break;
            case ULTIMO:
                respuesta = this.controlador.ultimo();
                break;
        }

        if (respuesta.getTodoOK()) {
            this.limpiarControles();

        } else {
////            //Lanzo el mensaje de info
////            MensajeInfoError msg = new MensajeInfoError(null, Boolean.TRUE, respuesta.getMensajes(), MensajeInfoError.TipoMensaje.INFO, "");
////            msg.setVisible(true);
        }
    }

    private void moverInicio()
    {
        this.mover(AuxVimso.Movimiento.INICIO);
    }
    private void moverAnterior()
    {
        this.mover(AuxVimso.Movimiento.ANTERIOR);
    }
     private void moverSiguiente()
    {
        this.mover(AuxVimso.Movimiento.SIGUIENTE);
    }
    private void moverUltimo()
    {
        this.mover(AuxVimso.Movimiento.ULTIMO);
    }
    
    private void quitarIconos(){
        this.setIconifiable(false);
        this.setMaximizable(false);
        this.setClosable(true);
        this.setResizable(false);
        this.setVisible(true);
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Mis Metodos Abstractos">
    //<editor-fold defaultstate="collapsed" desc="Movimiento">
//    public abstract void moverInicio();
//    public abstract void moverAnterior();
//    public abstract void moverSiguiente();
//    public abstract void moverUltimo();
    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="acciones">
    public abstract MyRespuesta accGuardar();
    public abstract void accNuevo();
    public abstract void accCancelar();
    public abstract MyRespuesta accEliminar();
    public abstract void accBuscar();
        
    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="otros">
    
    public abstract void limpiarControles();
    public abstract void accComboBox(String valor);
    public abstract void repintar();
    public abstract IMantenimiento getControlador();
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Modos de pantalla">
    private void activarTodosLosBotones()
    {
        this.btAnadir.setEnabled(Boolean.TRUE);
        this.btAnterior.setEnabled(Boolean.TRUE);
        this.btCancelar.setEnabled(Boolean.TRUE);
        this.btEliminar.setEnabled(Boolean.TRUE);
        this.btGuardar.setEnabled(Boolean.TRUE);
        this.btPrimero.setEnabled(Boolean.TRUE);
        this.btSiguiente.setEnabled(Boolean.TRUE);
        this.btUltimo.setEnabled(Boolean.TRUE);
    }
    //<editor-fold defaultstate="collapsed" desc="Modos">
    
    protected void modoNuevo()
    {
        this.limpiarControles();
        this.modoEditanto();
    }
    protected void modoVisor()
    {
        this.activarTodosLosBotones();
        this.btGuardar.setEnabled(Boolean.FALSE);
        this.btCancelar.setEnabled(Boolean.FALSE);
    }
    protected void modoEditanto()
    {
        this.activarTodosLosBotones();
        this.btAnadir.setEnabled(Boolean.FALSE);
        this.btEliminar.setEnabled(Boolean.FALSE);
    }
    //</editor-fold>
    //</editor-fold>
    //</editor-fold>

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBar1 = new javax.swing.JToolBar();
        btAnadir = new javax.swing.JButton();
        btEliminar = new javax.swing.JButton();
        btBuscar = new javax.swing.JButton();
        btGuardar = new javax.swing.JButton();
        btCancelar = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        btPrimero = new javax.swing.JButton();
        btAnterior = new javax.swing.JButton();
        btSiguiente = new javax.swing.JButton();
        btUltimo = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        cbOrden = new javax.swing.JComboBox();
        pnPadre = new javax.swing.JPanel();

        setIconifiable(true);
        setMinimumSize(new java.awt.Dimension(400, 360));
        setPreferredSize(new java.awt.Dimension(410, 390));
        setVisible(true);

        jToolBar1.setFloatable(false);
        jToolBar1.setMaximumSize(new java.awt.Dimension(33060, 33));

        btAnadir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Anadir.png"))); // NOI18N
        btAnadir.setToolTipText("Nuevo usuario");
        btAnadir.setFocusable(false);
        btAnadir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btAnadir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btAnadir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btAnadirActionPerformed(evt);
            }
        });
        jToolBar1.add(btAnadir);

        btEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/trash.png"))); // NOI18N
        btEliminar.setToolTipText("Eliminar usuario");
        btEliminar.setFocusable(false);
        btEliminar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btEliminar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btEliminarActionPerformed(evt);
            }
        });
        jToolBar1.add(btEliminar);

        btBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/buscar.png"))); // NOI18N
        btBuscar.setToolTipText("Buscar Usuario");
        btBuscar.setFocusable(false);
        btBuscar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btBuscar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btBuscarActionPerformed(evt);
            }
        });
        jToolBar1.add(btBuscar);

        btGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Guardar.png"))); // NOI18N
        btGuardar.setToolTipText("Guardar cambios");
        btGuardar.setFocusable(false);
        btGuardar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btGuardar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btGuardarActionPerformed(evt);
            }
        });
        jToolBar1.add(btGuardar);

        btCancelar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Cancelar.png"))); // NOI18N
        btCancelar.setToolTipText("Cancelar cambios");
        btCancelar.setFocusable(false);
        btCancelar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btCancelar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btCancelarActionPerformed(evt);
            }
        });
        jToolBar1.add(btCancelar);
        jToolBar1.add(jSeparator1);

        btPrimero.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Inicio.png"))); // NOI18N
        btPrimero.setToolTipText("Primero");
        btPrimero.setFocusable(false);
        btPrimero.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btPrimero.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btPrimero.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPrimeroActionPerformed(evt);
            }
        });
        jToolBar1.add(btPrimero);

        btAnterior.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Anterior.png"))); // NOI18N
        btAnterior.setToolTipText("Anterior");
        btAnterior.setFocusable(false);
        btAnterior.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btAnterior.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btAnterior.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btAnteriorActionPerformed(evt);
            }
        });
        jToolBar1.add(btAnterior);

        btSiguiente.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Siguiente.png"))); // NOI18N
        btSiguiente.setToolTipText("Siguiente");
        btSiguiente.setFocusable(false);
        btSiguiente.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btSiguiente.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btSiguiente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSiguienteActionPerformed(evt);
            }
        });
        jToolBar1.add(btSiguiente);

        btUltimo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jumavidesktop/recursos/iconos/Final.png"))); // NOI18N
        btUltimo.setToolTipText("Último");
        btUltimo.setFocusable(false);
        btUltimo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btUltimo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btUltimo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btUltimoActionPerformed(evt);
            }
        });
        jToolBar1.add(btUltimo);
        jToolBar1.add(jSeparator2);

        cbOrden.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        cbOrden.setToolTipText("CriterioDeOrdenacion");
        cbOrden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbOrdenActionPerformed(evt);
            }
        });
        jToolBar1.add(cbOrden);

        pnPadre.setMinimumSize(new java.awt.Dimension(200, 200));

        javax.swing.GroupLayout pnPadreLayout = new javax.swing.GroupLayout(pnPadre);
        pnPadre.setLayout(pnPadreLayout);
        pnPadreLayout.setHorizontalGroup(
            pnPadreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        pnPadreLayout.setVerticalGroup(
            pnPadreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 316, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            .addComponent(pnPadre, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(6, 6, 6)
                .addComponent(pnPadre, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void llenarComboBox(){
        cbOrden.removeAllItems();
        List<String> l = this.controlador.ordenarPor();
        for(String valor : l){
            cbOrden.addItem(valor);
        }
        centinela=true;
    }
    
    private void btAnadirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAnadirActionPerformed
        this.controlador.setCreandoEntidad(true);
        this.accNuevo();
        
    }//GEN-LAST:event_btAnadirActionPerformed

    private void btPrimeroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPrimeroActionPerformed
        this.moverInicio();
        this.repintar();
    }//GEN-LAST:event_btPrimeroActionPerformed

    private void btGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btGuardarActionPerformed
        MyRespuesta resp=this.accGuardar();        
        if (!resp.getTodoOK()) {
            this.sacarMensajeError("Imposible guardar", resp);            
        }
        this.repintar();
    }//GEN-LAST:event_btGuardarActionPerformed

    private void btEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btEliminarActionPerformed
        //Verifco que exita un registro selecionado        
        if (this.controlador.getEntidadActual() != null) {
            //Saco un mensaje para que me confirme
            int seleccion = JOptionPane.showOptionDialog(
                    this,
                    "¿Esta seguro de que desea eliminar el registro?",
                    "¿Borrar registro?",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null, // null para icono por defecto.
                    new Object[]{"Si", "No"}, // null para YES, NO y CANCEL
                    "No");

            if (seleccion == 0) {//lo del 0 es por que "Si" es el primer item del array de object que se le pasa como posibles opciones
                MyRespuesta resp = this.accEliminar();
                if (!resp.getTodoOK()) {
                    this.sacarMensajeError("Imposible eliminar registro", resp);
                } else {
                    //Mover a anterior a no ser que fuese el primero, que se deberá mover al nuevo primero
                    this.moverAnterior();
                    this.repintar();
                }
            }
        } else {
            this.sacarMensajeError("Imposible eliminar registro", new MyRespuesta("No esta posicionado sobre un registro válido"));
        }
    }//GEN-LAST:event_btEliminarActionPerformed

    private void sacarMensajeError(String Titulo,MyRespuesta respuesta)
    {
        MensajeInfoError msg = new MensajeInfoError(null, false, respuesta.getMensajes(), MensajeInfoError.TipoMensaje.ERROR, Titulo);
        msg.setLocationRelativeTo(null);
        this.getPadre().toBack();
        this.getPadre().toFront();
        msg.toFront();
        msg.setVisible(true);
    }
    private void btCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCancelarActionPerformed
        this.accCancelar();
        this.repintar();
    }//GEN-LAST:event_btCancelarActionPerformed

    private void btAnteriorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAnteriorActionPerformed
        this.moverAnterior();
        this.repintar();
    }//GEN-LAST:event_btAnteriorActionPerformed

    private void btSiguienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSiguienteActionPerformed
        this.moverSiguiente();
        this.repintar();
    }//GEN-LAST:event_btSiguienteActionPerformed

    private void btUltimoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btUltimoActionPerformed
        this.moverUltimo();
        this.repintar();
    }//GEN-LAST:event_btUltimoActionPerformed

private void cbOrdenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbOrdenActionPerformed
    if(cbOrden!=null && centinela){
        String valor = cbOrden.getSelectedItem().toString();
        accComboBox(valor);
    }
    this.controlador.inicio();
    this.repintar();
}//GEN-LAST:event_cbOrdenActionPerformed

private void btBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btBuscarActionPerformed
    this.accBuscar();
    this.repintar();
}//GEN-LAST:event_btBuscarActionPerformed




    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btAnadir;
    private javax.swing.JButton btAnterior;
    private javax.swing.JButton btBuscar;
    private javax.swing.JButton btCancelar;
    private javax.swing.JButton btEliminar;
    private javax.swing.JButton btGuardar;
    private javax.swing.JButton btPrimero;
    private javax.swing.JButton btSiguiente;
    private javax.swing.JButton btUltimo;
    private javax.swing.JComboBox cbOrden;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JPanel pnPadre;
    // End of variables declaration//GEN-END:variables

    public JPanel getPnPadre() {
        return pnPadre;
    }

    public void setPnPadre(JPanel pnPadre) {
        this.pnPadre = pnPadre;
    }

    public JFrame getPadre() {
        return padre;
    }

    public void setPadre(JFrame padre) {
        this.padre = padre;
    }

    public JToolBar getjToolBar1() {
        return jToolBar1;
    }

    public void setjToolBar1(JToolBar jToolBar1) {
        this.jToolBar1 = jToolBar1;
    }
    
    
    
}
